/*
 * ConsoleCharset.java
 *
 *  created: 4.10.2011
 *  charset: UTF-8
 *  license: MIT (X11) (See LICENSE file for full license)
 */
package cz.mp.util.console;

import java.io.BufferedReader;
import java.io.InputStreamReader;

/**
 * Kódování znaků na konzoli.
 * <p>
 * Protože kódování znaků na konzoli v MS Windows je jiné než 
 * výchozí kódování znaků (viz {@literal System.getProperty("file.encoding")}).
 * <p>
 * (Vnitřně je pro MS Windows použit příkaz {@literal "chcp.com"}.)
 * 
 * @author Martin Pokorný
 * @version 0.1
 */
public class ConsoleCharset {
    
    static final boolean OS_IS_WINDOWS =
            System.getProperty("os.name").toLowerCase().contains("windows");    

    public static final String DEFAULT_NAME =
            System.getProperty("file.encoding");

    /**
     * Příkaz, který v MS Windows vypíše číslo znakové stránky kódování na 
     * konzoli.
     * Je {@value }.
     */
    private static final String WINDOWS_GETCP_COMMAND = "chcp.com";    
    
    /** */
    private ConsoleCharset() {
    }    
    
    /**
     * Zjistí jméno kódování znaků na konzoli (příkazové řádce).
     * 
     * @return 
     */
    public static String getName() {
        if (OS_IS_WINDOWS &&
                !DEFAULT_NAME.toLowerCase().contains("utf")) {
            try {
                // spuštění "chcp.com" vypíše: "Aktivní znaková stránka: 852"; 
                //  z toho se pozná: IBM852
                Process p = Runtime.getRuntime().exec(WINDOWS_GETCP_COMMAND);
                try {
                    p.waitFor();
                } catch (InterruptedException ex) {                    
                }
                BufferedReader br = new BufferedReader(
                        new InputStreamReader(p.getInputStream()));
                String out = br.readLine();
                br.close();
                if (out != null && !out.isEmpty()) {
                    return "IBM" + out.substring(out.indexOf(": ")+2);
                }                
            } catch (Exception ex) {
                // nic; prostě se použije výchozí kódování znaků v os
            }
            return DEFAULT_NAME;
        }   
        else {
            return DEFAULT_NAME;
        }
    }

}   
